package fiuba.algo3.algothief.modelo;

import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class Pais {
	
	protected String nombre;
	protected String bandera;
	protected String moneda;
	protected String idioma;
	protected String capital;
	protected double latitud;
	protected double longitud;
	private ArrayList<Lugar> lugares;

	public Pais (String nombre,String bandera,String moneda,String idioma,String capital, double latitud, double longitud) {
		this.nombre = nombre;
		this.bandera = bandera;
		this.moneda = moneda;
		this.idioma = idioma;
		this.capital = capital;
		this.latitud = latitud;
		this.longitud = longitud;
		this.lugares = new ArrayList<Lugar>();
	}
	
	public Pais () {
		this.lugares = new ArrayList<Lugar>();
	}
	
	public String getNombre () {
		return this.nombre;
	}
	
	public String getBandera () {
		return this.bandera;
	}
	
	public String getMoneda () {
		return this.moneda;
	}
	
	public String getIdioma () {
		return this.idioma;
	}
	
	public String getCapital () {
		return this.capital;
	}
	
	public double calcularDistancia(Pais paisDeDestino) {
		double radioTierra = 6378.137;
		double variacionLatitud = ((paisDeDestino.getLatitud() - this.latitud)*Math.PI)/180;
		double variacionLongitud = ((paisDeDestino.getLongitud() - this.longitud))*Math.PI/180;
		double a = Math.sin(variacionLatitud/2)*Math.sin(variacionLatitud/2)+Math.cos((this.latitud*Math.PI)/180)*Math.cos((paisDeDestino.getLatitud()*Math.PI)/180)*Math.sin(variacionLongitud/2)*Math.sin(variacionLongitud/2);
		double c = 2 * Math.atan2(Math.sqrt(a),Math.sqrt(1-a));
		return (int)(radioTierra * c);
	}

	private double getLongitud() {
		return this.longitud;
	}

	private double getLatitud() {
		return this.latitud;
	}
	
	public void agregarLugar(Lugar unLugar) {
		this.lugares.add(unLugar);
	}
	
	public ArrayList<Lugar> getLugares() {
		return this.lugares;		
	}

	
	public Element serializar(Document doc) {
		Element elementoPais = doc.createElement("Pais");		
		elementoPais.setAttribute("nombre", this.nombre);
		elementoPais.setAttribute("bandera", this.bandera);
		elementoPais.setAttribute("moneda", this.moneda);
		elementoPais.setAttribute("idioma", this.idioma);
		elementoPais.setAttribute("capital", this.capital);
		Element elementoLugares = doc.createElement("Lugares");
		elementoPais.appendChild(elementoLugares);
		for (Lugar lugar : this.lugares) {
			elementoLugares.appendChild(lugar.serializar(doc));
		}
		return elementoPais;
	}
		
	public static Pais hidratar(Document doc) {
		Pais nuevoPais = new Pais();
		Element elementoPais = (Element)doc.getElementsByTagName("Pais").item(0);
		nuevoPais.nombre = elementoPais.getAttribute("nombre");
		nuevoPais.bandera = elementoPais.getAttribute("bandera");
		nuevoPais.moneda = elementoPais.getAttribute("moneda");
		nuevoPais.idioma = elementoPais.getAttribute("idioma");
		nuevoPais.capital = elementoPais.getAttribute("capital");
		Element elementoLugares = (Element)doc.getElementsByTagName("Lugares").item(0);
		for(int i=0; i< elementoLugares.getChildNodes().getLength(); i++) {
			Lugar lugar = Lugar.hidratar(elementoLugares.getChildNodes().item(i));
			nuevoPais.agregarLugar(lugar);
		}
		return nuevoPais;	
	}

	public Lugar getLugar(int i) {
		return (lugares.get(i));
	}	
	
	
	
	
	
	
	
	
}	
